<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // Promise实例的拓展方法
    // then()
    // catch()
    // finally()

    // catch()和finally() 也是基于then方法封装的

    // 返回值: 新的Promise实例  -> 链式操作


    // then() 方法的链式操作
    // (1) 如果then()方法中接收的参数不是函数, Promise实例的状态和存储的数据都会依次向后传递(传递给新的Promise实例)
    // (2) 如果then()方法中接收的参数是函数, 当Promise实例状态改变之后,会执行对应的回调函数,回调函数执行完毕,新的Promise实例也是变为fulfilled(已成功),回调函数的返回值,回作为新的Promise实例的数据存储, 如果回调函数执行过程中出现错误,错误会被捕获, 新的Promise实例也是变为rejected(已失败),错误的信息会作为Promise对象的数据向后传递

    // 情况1:
    // var p = new Promise(function (resolve, reject) {
    //     resolve(1);
    //     // reject(2);
    // })
    // console.log(p);

    // console.log(p.then());
    // console.log(p.then().then());
    // console.log(p.then().then().then());

    // p.then().then().then().then().then().then(function (arg) {
    //     console.log("fulfilled", arg);
    // }, function (arg) {
    //     console.log("rejected", arg);
    // })


    // var p = new Promise(function (resolve, reject) {
    //     setTimeout(function () {
    //         resolve(1);
    //         // reject(2);

    //         console.log(p);
    //         console.log(p1);
    //         console.log(p2);
    //         console.log(p3);

    //     }, 2000)
    // })


    // var p1 = p.then();
    // var p2 = p.then().then();
    // var p3 = p.then().then().then();


    // console.log(p);
    // console.log(p1);
    // console.log(p2);
    // console.log(p3);





    //情况2:
    // var p = new Promise(function (resolve, reject) {
    //     setTimeout(function () {
    //         resolve("a");
    //         // reject("A");
    //     }, 2000)
    // })
    // console.log(p);


    // p.then(function (arg) {
    //     console.log("fulfilled", arg); // "a"
    //     throw "b"; // 以错误形式 抛出"b"
    //     return "b";
    // }, function (arg) {
    //     console.log("rejected", arg);
    //     return "B";
    // }).then(function (arg) {
    //     console.log("fulfilled", arg);
    // }, function (arg) {
    //     console.log("rejected", arg);
    // })



    // var p = new Promise(function (resolve, reject) {
    //     setTimeout(function () {
    //         resolve("a");
    //         // reject("A");
    //     }, 2000)
    // })
    // console.log(p);

    // then() 方法的链式操作过程中,只指定了Promise对象变为已成功时执行的回调函数,如果Promise对象变为已失败,Promise实例的rejected(已失败)状态和存储的数据都会依次向后传递
    // 成功就走then,失败走catch -> catch用于捕获整个链式操作过程中所有的错误
    // p.then(function (arg) {
    //     console.log("fulfilled", arg); // "a"
    //     return "b";
    // }).then(function (arg) {
    //     console.log("fulfilled", arg); // "b"
    //     throw "C"; // 以错误形式 抛出"C"
    //     return "c";
    // }).then(function (arg) {
    //     console.log("fulfilled", arg);  //"c"
    // }).catch(function (arg) {
    //     console.log("rejected", arg);
    // })







</script>

</html>